export default function (data, select, tree, textarea) {
  // 获取文件夹
  const picker = async () => {
    // 获取文件夹管理对象
    try {
      const dir = await showDirectoryPicker({
        mode: 'readwrite', // 默认为 read 标识请求读取权限 ， 如果后续有修改操作 需要 'readwrite' 读写权限
      });
      data.value.push(dir);
    } catch (err) {
      alert(err);
    }
  };

  // 创建一个文件
  const createFile = async () => {
    const name = prompt('输入文件名称（包括后缀名）', '新建文件.txt');

    if (!name) alert('取消了操作');
    try {
      const file = await select.data.getFileHandle(name, {
        create: true,
      });
      tree.value.append(file, select.node);
    } catch (err) {
      alert(err);
    }
  };

  // 新建一个文件夹
  const createDir = async () => {
    const name = prompt('输入目录名称', '新建文件夹');
    if (!name) alert('取消了操作');
    try {
      const file = await select.data.getDirectoryHandle(name, {
        create: true,
      });
      tree.value.append(file, select.node);
    } catch (err) {
      alert(err);
    }
  };

  // 写入内容
  const writable = async () => {
    try {
      // 创建操作对象
      const FileWritable = await select.data.createWritable();

      // 写入内容
      await FileWritable.write(textarea.value);
      // 关闭操作对象 关闭后才会对修改进行保存
      await FileWritable.close();
      alert('修改成功');
    } catch (err) {
      alert(err);
    }
  };

  // 删除文件
  const removeFile = async () => {
    try {
      // 调用删除
      await select.data.remove();
      // 再列表中删除
      select.node.remove();
      select.data = null;
      select.node = null;
      select.type = null;
      textarea.value = '';
      textarea.type = '';
      alert('删除成功');
    } catch (err) {
      alert(err);
    }
  };

  return {
    picker,
    createFile,
    createDir,
    writable,
    removeFile,
  };
}

/**
 *
 * @param {FileSystemDirectoryHandle} dir 文件夹句柄
 * @param {Boolean} hidden 是否包括隐藏文件
 * @returns {FileSystemFileHandle[]} 包含所有子句柄的数组
 */
export async function openDirectory(dir, hidden = false) {
  const values = [];
  for await (const iterator of dir.values()) {
    // 不包括隐藏文件
    if (!/^\./.test(iterator.name) || hidden) values.push(iterator);
  }
  return values;
}
